package com.jdk.learn.exam.io;

import java.io.*;
import java.util.Date;

/**
 * Created by ricky
 * on 2018/3/5.
 数据流:
    字节流:
        inputStream
        OutputStream
    字符流:
        Reader
        Writer
 */
public class IODemo {

    /**
     * IO练习  输入流
     */
    public static void InputStreamDemo() {
        try(FileInputStream fis=new FileInputStream(new File(""))) {

            fis.read();//读取一个字节到内存中
            byte[] bytes=new byte[1024];
            fis.read(bytes);//读取1024字节到内存
            fis.read(bytes,0,10);//读取10个字节数据  放置到数组中  从0开始
//            fis.close();//关闭流
            fis.available();//可从数据流中读取数据的字节数
            fis.skip(10); //跳过10个字节不读取
            fis.markSupported();//是否支持标记  用来回滚
            fis.mark(10);//标记10 用来reset时使用
            fis.reset();//回到标记出
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * IO练习  输出流
     */
    public static void OuputStreamDemo() {
        try(FileOutputStream fos=new FileOutputStream(new File(""))) {
            fos.write(10);//将字节10写入流中
            fos.write("HelloWorld".getBytes());//将Helloworld字节写入流中
            fos.write("HelloWorld".getBytes(),0,10);//将Helloworld字节写入流中

            fos.close();//关闭流 上面try这种写法可以自动关闭  继承autoClosAble
            fos.flush();//刷新此输出流，并强制写出缓冲的字节
            fos.getChannel();//获取通道  NIO里面使用
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * IO练习  包装流  过滤器
     *
     * 缓冲区 此功能降低了各设备之间速度的差异。
     */
    public static void BufferStreamDemo() {
        try(FileInputStream fis=new FileInputStream(new File(""));
                FileOutputStream fos=new FileOutputStream(new File(""));) {
            InputStream is=new BufferedInputStream(fis);
            InputStream is2=new BufferedInputStream(fis,1024);//自行设置缓冲区大小
            OutputStream os=new BufferedOutputStream(fos);
            OutputStream os2=new BufferedOutputStream(fos,1024);//自行设置缓冲区大小

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * IO练习  数据数据流
     *
     * 缓冲区 此功能降低了各设备之间速度的差异。
     */
    public static void DataStreamDemo() {
        try(FileInputStream fis=new FileInputStream(new File(""));
                FileOutputStream fos=new FileOutputStream(new File(""));) {
            DataInputStream dis=new DataInputStream(fis);
            dis.readBoolean();
            dis.readChar();
            dis.readDouble();
            dis.readShort();

            DataOutputStream dos=new DataOutputStream(fos);
            dos.writeBoolean(false);
            dos.writeChar(96);
            //....
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * IO练习  对象数据流
     *
     * 缓冲区 此功能降低了各设备之间速度的差异。
     */
    public static void ObjectStreamDemo() {
        try(FileInputStream fis=new FileInputStream(new File(""));
                FileOutputStream fos=new FileOutputStream(new File(""));) {
           ObjectInputStream ois=new ObjectInputStream(fis);
           Date d=null;
            d = (Date)ois.readObject();


            ObjectOutputStream oos=new ObjectOutputStream(fos);
            oos.writeObject(new Date());

            ois.close();
            oos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

      /**
     * 读写字符流
     */
    public static void WriterAndReader() {
        try(FileInputStream fis=new FileInputStream(new File(""));
            FileOutputStream fos=new FileOutputStream(new File(""));) {

            InputStreamReader reader=new InputStreamReader(fis);
            reader.read();//读取一个字节
            char[] chars=new char[1024];
            reader.read(chars);

            reader.ready();//是否就绪
            reader.close();//关闭流

            OutputStreamWriter writer=new OutputStreamWriter(fos);
            writer.write(chars);
            writer.write("字符串");
            writer.flush();//刷新并写入
            writer.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 带缓冲区的读写字符流
     */
    public static void BufferedWriterAndReader() {
        try(FileInputStream fis=new FileInputStream(new File(""));
            FileOutputStream fos=new FileOutputStream(new File(""));) {
            char[] chars=new char[1024];
            InputStreamReader reader=new InputStreamReader(fis);
            BufferedReader bread=new BufferedReader(reader);
            bread.read();//读取一个字符
            bread.read(chars);
            String res;
            bread.readLine();//读取一行返回字符串
            while ((res=bread.readLine())!=null){
                System.out.println(res);
            }
            bread.close();
            reader.close();//关闭流

            OutputStreamWriter writer=new OutputStreamWriter(fos);
            BufferedWriter bwriter=new BufferedWriter(writer);

            bwriter.newLine();//新行
            bwriter.write("世界你好");
            writer.flush();//刷新并写入
            writer.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /***
     * 文件相关练习
     */
    public void FileDemo() {
        File file=new File("d:\\test002rename.txt");//可以是文件地址，也可以是文件目录，

        File dir=new File("d:\\");//目录
        File path=new File(dir,"test002.txt");//路径地址
        //文件名相关
        path.getName();
        path.getPath();//文件路径
        path.getAbsolutePath();//文件绝对路径
        path.getParent();//父级目录名
        path.renameTo(file);//重命名

        //文件属性
        path.exists();//是否存在
        path.canWrite();//是否可写
        path.canRead();//是否可读
        path.isFile();//是否是文件
        path.isDirectory();//是否是目录
        path.isAbsolute();//是否是绝对路径

        //其他
        path.lastModified();//最后修改
        path.length();//文件长度
        path.delete();//删除文件

        //目录
        path.mkdir();//只能一级
        path.mkdirs();//可以生成多级
        path.list();//

        try {
            //随机访问文件 普通的File是顺序IO读取 一般不能回读(可以通过一定手段实现回读)，可以随机的读取文件不同位置的内容
            RandomAccessFile ras=new RandomAccessFile("d:\\test002rename.txt","rw");

            ras.seek(10);//调整文件指针位置
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {

    }
}
